﻿using System;
using System.Windows.Forms;
using Library.BLL;
using System.Data;
using System.Runtime.Remoting.Messaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Collections.Specialized;
using View.dsDiariasTableAdapters;

namespace View
{
    public partial class frmUsuarios : Form
    {

        #region declaracao dos DataTables
        DataTable dtUsuarios;
        DataTable dtUsuariosExcluidos;
        DataTable dtViagens;
        DataTable dtPagadores;
        DataTable dtViagensPorPeriodo;
        DataTable dtAux;
        #endregion

        #region declaracao dos controllers
        PessoaController ctrlUsuarios = new PessoaController();
        ViagensController ctrlViagens = new ViagensController();
        PagadoresController ctrlPagadores = new PagadoresController();
        #endregion
    
        public frmUsuarios()
        {
            InitializeComponent();
        }

        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            //Cria DataTable Auxiliar para utilização das viagens por período
            dtAux = new DataTable();
            dtAux.TableName = "VIAGENS";
            dtAux.Columns.Add(new DataColumn("VIAGEM", typeof(string)));
            dtAux.Columns.Add(new DataColumn("COD_VIAGEM", typeof(int)));
            dtAux.Columns.Add(new DataColumn("DT_RELATORIO", typeof(string)));
            dtAux.Columns.Add(new DataColumn("COD_PAGADOR", typeof(int)));

            //Carrega Impressoras no Combo
            foreach (string prt in PrinterSettings.InstalledPrinters)
                cbPrinters.Items.Add(prt);

            if (cbPrinters.Items.Count > 0)
                cbPrinters.SelectedIndex = 0;

            this.cbTipoRelatorio.SelectedIndex = 0;

            this.WindowState = FormWindowState.Maximized;
            this.populaListaUsuarios();

        }

        private void lstUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstUsuarios.SelectedIndex != -1)
            {
                //limpa listbox
                lstPeriodosDisponiveis.DataSource = null;
                lstOrgaosPagadores.DataSource = null;

                ((frmMain)this.MdiParent).tslblUsuario.Text = dtUsuarios.Rows[lstUsuarios.SelectedIndex]["NOME_PESSOA"].ToString();

                int idUsuario = 0;
                bool converted = Int32.TryParse(dtUsuarios.Rows[lstUsuarios.SelectedIndex]["COD_PESSOA"].ToString(), out idUsuario);
                if (!converted)
                    idUsuario = 0;

                this.populaViagens(idUsuario);
            }
        }

        private void lstPeriodosDisponiveis_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (lstPeriodosDisponiveis.SelectedIndex != -1)
            {
                string periodo = String.Empty;

                periodo = dtViagens.Rows[lstPeriodosDisponiveis.SelectedIndex]["PERIODO"].ToString();

                this.populaPagadores(periodo);

                txtData.Text = "01/" + dtViagens.Rows[lstPeriodosDisponiveis.SelectedIndex]["PERIODO"].ToString();
                txtViagens.Text = dtViagensPorPeriodo.Rows.Count > 0 ? dtViagensPorPeriodo.Rows.Count.ToString() : String.Empty;
                txtValor.Text = dtViagens.Rows[lstPeriodosDisponiveis.SelectedIndex]["VALOR_TOTAL"].ToString().Replace('.',',');
            }
        }

        private void btnNovoUsuario_Click(object sender, EventArgs e)
        {
            frmCadastroUsuario frmNovoUsuario = new frmCadastroUsuario();
            DialogResult cadastrado = frmNovoUsuario.ShowDialog();
            
            if ( cadastrado == DialogResult.OK )
            { 
                populaListaUsuarios();
            }
        }

        private void btnAlterarUsuario_Click(object sender, EventArgs e)
        {
            if (lstUsuarios.SelectedIndex != -1)
            {
                int codigoUsuario = Convert.ToInt32(lstUsuarios.SelectedValue);
                frmCadastroUsuario frmNovoUsuario = new frmCadastroUsuario(codigoUsuario);
                DialogResult cadastrado = frmNovoUsuario.ShowDialog();

                if (cadastrado == DialogResult.OK)
                {
                    populaListaUsuarios();
                }
            }
        }

        #region metodos para popular

        private void populaListaUsuarios()
        {
            dtUsuarios = ctrlUsuarios.getListaDadosUsuario();
            lstUsuarios.DataSource = dtUsuarios;
            lstUsuarios.DisplayMember = "NOME_PESSOA";
            lstUsuarios.ValueMember = "COD_PESSOA";
        }


        private void populaPagadores(string periodo)
        {
            dtPagadores = ctrlPagadores.getPagadoresPorPeriodo(periodo);
            lstOrgaosPagadores.DataSource = dtPagadores;
            lstOrgaosPagadores.DisplayMember = "NOME_PAGADOR";
            lstOrgaosPagadores.ValueMember = "COD_PAGADOR";

            dtViagensPorPeriodo = ctrlViagens.getViagensPorPeriodo(periodo);
            this.validaIgnorarPagadores();

            if (dtPagadores.Rows.Count <= 1)
            {
                this.cbPagadores.Checked = true;
                this.cbPagadores.Enabled = false;
            }
            else
            {
                this.cbPagadores.Checked = false;
                this.cbPagadores.Enabled = true;
            }
                
        }

        private void populaViagens(Int32 idUsuario)
        {
            dtViagens = ctrlViagens.getViagensPorCliente(idUsuario);
            lstPeriodosDisponiveis.DataSource = dtViagens;
            lstPeriodosDisponiveis.DisplayMember = "PERIODO";
            lstPeriodosDisponiveis.ValueMember = "PERIODO";
        }

        #endregion

        private void btnNovaViagem_Click(object sender, EventArgs e)
        {
            frmCadastroViagem frmNovaViagem = new frmCadastroViagem();
            DialogResult cadastrado = frmNovaViagem.ShowDialog();

            if (cadastrado == DialogResult.OK)
            {
                populaListaUsuarios();
            }
        }

        private void btnExcluirUsuario_Click(object sender, EventArgs e)
        {
            if (lstUsuarios.SelectedIndex != -1)
            {
                DialogResult confirmar = MessageBox.Show("Deseja realmente excluir " + lstUsuarios.Text + " ?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (confirmar == DialogResult.Yes)
                {
                    int codigoUsuario = Convert.ToInt32(lstUsuarios.SelectedValue);
                    dtUsuariosExcluidos = ctrlUsuarios.getDadosUsuario(codigoUsuario);

                    if (dtUsuariosExcluidos.Rows.Count > 0)
                    {
                        //Apaga usuários da lista
                        dtUsuariosExcluidos.Rows[0].Delete();
                        ctrlUsuarios.UpdateDataTable(dtUsuariosExcluidos.GetChanges());
                        dtUsuariosExcluidos.AcceptChanges();
                    }
                    populaListaUsuarios();
                }
            }
        }

        private void btnImpressora_Click(object sender, EventArgs e)
        {

        }

        private void lklblHistorico_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            lklblHistorico.Text = (!spCtrPrincipal.Panel2Collapsed ? "Exibir histórico de viagens" : "Ocultar histórico de viagens");
            spCtrPrincipal.Panel2Collapsed = !spCtrPrincipal.Panel2Collapsed;
        }

        private void cbPagadores_CheckedChanged(object sender, EventArgs e)
        {
            this.validaIgnorarPagadores();
        }

        private void lstOrgaosPagadores_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstOrgaosPagadores.SelectedIndex > -1)
            {
                this.validaIgnorarPagadores();
            }
        }

        private void validaIgnorarPagadores()
        {
            if (!cbPagadores.Checked && this.dtPagadores.Rows.Count > 1)
            {
                if (dtViagensPorPeriodo != null && lstOrgaosPagadores.SelectedValue != null)
                {
                    dtAux.Clear();
                    dtViagensPorPeriodo.Select("COD_PAGADOR = " + lstOrgaosPagadores.SelectedValue.ToString()).CopyToDataTable<DataRow>(dtAux, LoadOption.OverwriteChanges);
                    lstViagens.DataSource = dtAux;
                    lstViagens.DisplayMember = "VIAGEM";
                    lstViagens.ValueMember = "COD_VIAGEM";
                }
            }
            else
            {
                lstViagens.DataSource = dtViagensPorPeriodo;
                lstViagens.DisplayMember = "VIAGEM";
                lstViagens.ValueMember = "COD_VIAGEM";
            }
        }

        private void cbTipoRelatorio_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.msktxtPeriodo.Text = String.Empty;

            if (cbTipoRelatorio.SelectedIndex == 0)
            {
                this.msktxtPeriodo.Enabled = true;
                this.msktxtPeriodo.Mask = "0000";
                this.msktxtPeriodo.Text = DateTime.Today.Year.ToString("0000");
            }
            else if (cbTipoRelatorio.SelectedIndex == 1)
            {
                this.msktxtPeriodo.Enabled = true;
                this.msktxtPeriodo.Mask = "00/0000";
                this.msktxtPeriodo.Text = DateTime.Today.Month.ToString("00") + DateTime.Today.Year.ToString("0000");
            }
            else
            {
                this.msktxtPeriodo.Enabled = false;
                this.msktxtPeriodo.Mask = String.Empty;
            }
        }

        private void btnVisualizar_Click(object sender, EventArgs e)
        {

            switch ((Int32)cbTipoRelatorio.SelectedIndex)
            {
                case 0:
                    
                    frmResumos frmResumoAno = new frmResumos(msktxtPeriodo.Text,Util.TipoResumo.RESUMO_ANUAL);
                    frmResumoAno.Show();
                    break;

                case 1:

                    frmResumos frmResumoMensal = new frmResumos(msktxtPeriodo.Text, Util.TipoResumo.RESUMO_MENSAL);
                    frmResumoMensal.Show();

                    break;

                case 2:

                    break;

                case 3:

                    break;
            }
        }
    }
}
